// axios封装 请求拦截、响应拦截、错误统一处理
import _axios from 'axios';
//import router from '../router';
import store from '../../store';
import msg from '../../msg';
//import qs from 'qs';

//console.log('env:',process.env.NODE_ENV)

//axios apis域名
let _apiBaseUrl = '';
// 生产环境api域名
if (process.env.NODE_ENV === 'production') {
	_apiBaseUrl = '';
}

// 提示函数 禁止点击蒙层、显示一秒后关闭
/*const tip = msg => {
	Toast({
		message: msg,
		duration: 1000,
		forbidClick: true
	});
}*/

const toLogin = () => {
	console.log('去登录')
	/*router.replace({
		path: '/login',
		query: {
			redirect: router.currentRoute.fullPath
		}
	});*/
}

// 请求失败后的错误统一处理
const errorHandle = (status, result) => {
	// 状态码判断
	switch (status) {
		// 401: 未登录状态，跳转登录页
		case 401:
			msg.alert.error('未登录，请先登录', '未登录', () => {
				toLogin()
			})
			break;
		// 403 token过期 清除token并跳转登录页
		case 403:
			sessionStorage.removeItem(window.consts.strings.adminToken);
			store.commit('loginSuccess', null);
			msg.alert.error('登录已过期，请重新登录', '未登录', () => {
				toLogin();
			})
			break;
		// 404请求不存在
		case 404:
			msg.alert.info('请求的资源不存在')
			break;
		default:
			console.log('================= ERROR ===============');
			console.log(result);
			console.log('=============== END ERROR =============');
	}
}

// 创建axios实例
var instance = _axios.create({
		baseURL: _apiBaseUrl,
		//headers: {'X-Custom-Header': 'foobar'},
		timeout: 1000 * 60 * 200
	}
); //2分钟
//instance.defaults.headers['Content-Type'] = 'application/json';
//instance.defaults.headers.post['Content-Type'] = 'text/plain';

/*instance.defaults.transformRequest = [function (data) {
	// 数据序列化  请求前的处理
	return JSON.stringify(data)
}]*/

// 设置post请求头
/*instance.defaults.headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
instance.defaults.headers['Content-Type'] = 'application/json';*/
/*instance.defaults.transformRequest = [function (data) {
	// 数据序列化  请求前的处理
	return JSON.stringify(data)
}]*/

/**
 * 请求拦截器
 * 每次请求前，如果存在token则在请求头中携带token
 */
instance.interceptors.request.use(
	config => {
		//console.log(config.headers)
		const token = sessionStorage.getItem(window.consts.strings.adminToken);
		//token && (config.headers.Authorization = 'bearer ' + token);
        //config.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';
        config.headers.post['token'] = sessionStorage.getItem(window.consts.strings.userToken);
        if (!config.headers['Content-Type']) {
            //if ('multipart/form-data' !== config.headers['Content-Type']) {
            /*config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
            config.data = qs.stringify(config.data, { arrayFormat: 'brackets' });*/
			/*
		        qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' })
				// 'a[0]=b&a[1]=c'
		        qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' })
				// 'a[]=b&a[]=c'
		        qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' })
				// 'a=b&a=c'
			*/

            //}
        }
		return config;
	},
	error => Promise.error(error))

// 响应拦截器
instance.interceptors.response.use(
	// 请求成功
	res => {
		if(res.data.code===401){
			console.log('登录失效了')
			location.href='/';
		}
		//console.log('data:',res.data)
		return Promise.resolve(res.data);
	}, //res.status === 200 ? Promise.resolve(res.data) : Promise.reject(res),
	// 请求失败
	error => {
		const {response} = error;
		if (response) {
			console.log(response)
			// 请求已发出，但是不在2xx的范围
			errorHandle(response.status, response.data);
			return Promise.reject(response);
		} else {
			// 处理断网的情况
			// eg:请求超时或断网时，更新state的network状态
			// network状态在app.vue中控制着一个全局的断网提示组件的显示隐藏
			// 关于断网组件中的刷新重新获取数据，会在断网组件中说明
			//store.commit('changeNetwork', false);
			alert('连接超时')
		}
	});

//export default instance;
export const axios = instance;
export const baseURL = _apiBaseUrl;
